/**
 * 性能测试配置
 * @description 定义性能测试的阈值和配置参数
 */

/**
 * 性能阈值配置
 */
export const PERFORMANCE_THRESHOLDS = {
  // 渲染性能阈值
  RENDER: {
    /** 初始渲染最大时间（毫秒） */
    INITIAL_RENDER_MAX: 50,
    /** 重渲染最大时间（毫秒） */
    RE_RENDER_MAX: 20,
    /** 大量数据渲染最大时间（毫秒） */
    LARGE_DATA_RENDER_MAX: 100,
    /** 动画渲染最大时间（毫秒） */
    ANIMATION_RENDER_MAX: 16.67 // 60fps
  },

  // 交互性能阈值
  INTERACTION: {
    /** 点击响应最大时间（毫秒） */
    CLICK_RESPONSE_MAX: 10,
    /** 悬停响应最大时间（毫秒） */
    HOVER_RESPONSE_MAX: 5,
    /** 键盘导航响应最大时间（毫秒） */
    KEYBOARD_RESPONSE_MAX: 8,
    /** 状态切换最大时间（毫秒） */
    STATE_CHANGE_MAX: 15
  },

  // 内存使用阈值
  MEMORY: {
    /** 组件挂载内存增长最大值（MB） */
    MOUNT_MEMORY_INCREASE_MAX: 2,
    /** 重渲染内存增长最大值（MB） */
    RE_RENDER_MEMORY_INCREASE_MAX: 1,
    /** 内存泄漏检测阈值（MB） */
    MEMORY_LEAK_THRESHOLD: 5,
    /** 长时间运行内存增长最大值（MB） */
    LONG_RUNNING_MEMORY_MAX: 10
  },

  // 网络性能阈值
  NETWORK: {
    /** 资源加载最大时间（毫秒） */
    RESOURCE_LOAD_MAX: 1000,
    /** API响应最大时间（毫秒） */
    API_RESPONSE_MAX: 500,
    /** 缓存命中率最小值（百分比） */
    CACHE_HIT_RATE_MIN: 80
  },

  // 并发性能阈值
  CONCURRENCY: {
    /** 并发操作处理最大时间（毫秒） */
    CONCURRENT_OPERATIONS_MAX: 50,
    /** 最大并发操作数 */
    MAX_CONCURRENT_OPERATIONS: 20,
    /** 队列处理最大时间（毫秒） */
    QUEUE_PROCESSING_MAX: 30
  }
};

/**
 * 测试环境配置
 */
export const TEST_ENVIRONMENT = {
  /** 是否启用性能监控 */
  ENABLE_MONITORING: process.env.NODE_ENV === 'test',
  
  /** 是否输出详细日志 */
  VERBOSE_LOGGING: process.env.PERFORMANCE_VERBOSE === 'true',
  
  /** 测试重复次数 */
  TEST_ITERATIONS: parseInt(process.env.PERFORMANCE_ITERATIONS || '10'),
  
  /** 预热次数 */
  WARMUP_ITERATIONS: 3,
  
  /** 是否启用内存监控 */
  ENABLE_MEMORY_MONITORING: typeof (performance as any)?.memory !== 'undefined',
  
  /** 是否启用时间监控 */
  ENABLE_TIMING_MONITORING: typeof performance?.now !== 'undefined'
};

/**
 * 性能测试工具配置
 */
export const PERFORMANCE_TOOLS = {
  /** 是否使用真实的DOM操作 */
  USE_REAL_DOM: false,
  
  /** 是否模拟网络延迟 */
  SIMULATE_NETWORK_DELAY: true,
  
  /** 网络延迟范围（毫秒） */
  NETWORK_DELAY_RANGE: [10, 100],
  
  /** 是否启用垃圾回收 */
  ENABLE_GC: typeof (window as any)?.gc !== 'undefined',
  
  /** 垃圾回收间隔（毫秒） */
  GC_INTERVAL: 1000
};

/**
 * 性能报告配置
 */
export const PERFORMANCE_REPORTING = {
  /** 是否生成性能报告 */
  GENERATE_REPORT: process.env.GENERATE_PERFORMANCE_REPORT === 'true',
  
  /** 报告输出目录 */
  REPORT_OUTPUT_DIR: './performance-reports',
  
  /** 报告格式 */
  REPORT_FORMAT: ['json', 'html', 'csv'] as const,
  
  /** 是否包含图表 */
  INCLUDE_CHARTS: true,
  
  /** 是否上传到监控系统 */
  UPLOAD_TO_MONITORING: process.env.UPLOAD_PERFORMANCE_DATA === 'true'
};

/**
 * 获取性能阈值
 */
export const getPerformanceThreshold = (category: keyof typeof PERFORMANCE_THRESHOLDS, metric: string): number => {
  const categoryThresholds = PERFORMANCE_THRESHOLDS[category] as Record<string, number>;
  return categoryThresholds[metric] || 0;
};

/**
 * 检查是否超过性能阈值
 */
export const isPerformanceThresholdExceeded = (
  category: keyof typeof PERFORMANCE_THRESHOLDS,
  metric: string,
  value: number
): boolean => {
  const threshold = getPerformanceThreshold(category, metric);
  return value > threshold;
};

/**
 * 性能等级评定
 */
export const getPerformanceGrade = (value: number, threshold: number): 'excellent' | 'good' | 'fair' | 'poor' => {
  const ratio = value / threshold;
  
  if (ratio <= 0.5) return 'excellent';
  if (ratio <= 0.8) return 'good';
  if (ratio <= 1.0) return 'fair';
  return 'poor';
};

/**
 * 性能测试套件配置
 */
export const PERFORMANCE_TEST_SUITES = {
  /** 基础性能测试 */
  BASIC: {
    name: '基础性能测试',
    tests: ['render', 'interaction', 'memory'],
    timeout: 30000
  },
  
  /** 压力测试 */
  STRESS: {
    name: '压力测试',
    tests: ['concurrent', 'longRunning', 'memoryLeak'],
    timeout: 60000
  },
  
  /** 回归测试 */
  REGRESSION: {
    name: '性能回归测试',
    tests: ['baseline', 'comparison', 'trend'],
    timeout: 45000
  },
  
  /** 完整测试套件 */
  FULL: {
    name: '完整性能测试',
    tests: ['render', 'interaction', 'memory', 'concurrent', 'network'],
    timeout: 120000
  }
};

/**
 * 默认导出配置对象
 */
export default {
  thresholds: PERFORMANCE_THRESHOLDS,
  environment: TEST_ENVIRONMENT,
  tools: PERFORMANCE_TOOLS,
  reporting: PERFORMANCE_REPORTING,
  testSuites: PERFORMANCE_TEST_SUITES
};